<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
//http://www.cnblogs.com/wangfupeng1988/p/3977987.html
//1:一切皆对象(值类型不是对象,函数也是对象的一种)
//基本数据类型(值类型:undefined,String,number,布尔)存在于栈中,引用数据类型(对象,null,数组,函数)存在于堆中
// 值类型的判断用typeof 引用类型的判断用instanceof(更加准确的可以使用Object.prototype.toString.call(值))
// 对象的定义:若干属性的集合(对象里面的一切都是属性,方法也是属性的一种)
// 对象和函数的关系:对象都是通过函数的创建的
/*    function Fn() {}
    var fn = new Fn()
    var obj1 = { a: 10, b: 20 }; // 创建对象的语法糖1
    var arr2 = [5, 'x', true]; // 创建对象的语法糖2
//    本质
    var obj = new Object()
    obj.a = 10
    obj.b = 20
    var arr = new Array()
    arr[0] = 5
    arr[1] = 'x'
    arr[2] = true*/
// 原型
// 每个function都有一个prototype 每个对象都有一个__proto__(隐式原型)属性,指向创建该对象的函数的prototype

// 继承:通过原型链来体现的
// 原型链:访问对象属性的时候,先在基本属性中寻找,没有找到再到__proto__上寻找
//函数每调用一次就产生一个新的执行上下文环境
// 函数自由变量的作用域在函数定义的时候就已经确定
/*var a = 10
function fn() {
    console.log(a) // a是自由变量,在函数定义是时就确定了a取值的作用域(a = 10)
}
function f2(fn) {
    var a = 20
    fn() // 10 不是20
}
f2(fn)*/

// 闭包的应用:1:函数作为返回值;2:函数作为参数传递
</script>
</body>
</html>